import axios from 'axios'
import { getToken, removeToken } from '@/utils/auth'
import { ResponseCode } from '@/enums/httpEnum'
import { getAppEnvConfig } from '@/utils/env'
import router from '@/router'

const urlPrefix = getAppEnvConfig().VITE_API_URL_PREFIX
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: urlPrefix,
  // 超时时间
  timeout: 8 * 1000
})

// request拦截器
service.interceptors.request.use(
  config => {
    if (getToken()) {
      config.headers['token'] = getToken() // 让每个请求都携带token
    }
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

// respone拦截器
service.interceptors.response.use(
  response => {
    if (response.data.code === ResponseCode.SUCCESS) {
      return response.data
    } else {
      checkResponseStatus(response.data.code, response.data.message)
      // 处理过的业务逻辑异常
      return response.data
    }
  },
  error => {
    // 服务器异常
    console.log('axios : error', error)

    const err = error.toString()
    if(err.includes('404')) {
      // @ts-ignore
      $message.error('找不到服务器地址，请联系管理员')
    } else if(err.includes('500')) {
      // @ts-ignore
      $message.error('服务器异常，请联系管理员')
     } else if(err.includes('403')) {
       // @ts-ignore
      $message.error('权限不足，拒绝访问')
     } else {
      // @ts-ignore
      $message.error('未知异常，请联系管理员')
    }

    return Promise.reject(error)
  }
)


/**
 * 针对非正确的响应码进行处理
 * @param status
 */
function checkResponseStatus(status: number, message: string ) {
  // @ts-ignore
  const { $message: Message } = window

  switch (status) {
    case 404:
      Message.error('未找到该资源')
      break;
    case 403:
      Message.error('操作失败，你没有该权限')
      break;
    case 40001:
      Message.error('连接超时，请重新登录')
      removeToken()
      router.push({ path: '/login'})
      break;
    default:
      Message.error(message)
      break;
  }

}
export default service
